/**
 * 
 */
package GUI.pdaGrafica;

import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JWindow;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JScrollPane;
import java.awt.Rectangle;
import javax.swing.border.BevelBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

import modelo.Restaurante;
import modelo.gestionPedidos.Consumicion;
import modelo.gestionPedidos.Pedido;
import modelo.gestionReserva.Mesa;

import java.awt.Point;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

import javax.swing.JTable;
import javax.swing.ListSelectionModel;

/**
 * Esta clase implementa la sección para servir pedidos
 * 
 * @created 04-may-2007 00:04
 * @version 1.0
 * @author Enrique Menor Santos
 *
 */
public class SevirPlatos extends JWindow implements ActionListener, ListSelectionListener {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JScrollPane jSPlatosListos = null;
	
	private JTable jTPlatosListos = null;
	/***
	 * Modelo de datos de la tabla anterior
	 */
	private DefaultTableModel tablaModelo=null;  //  @jve:decl-index=0:visual-constraint="261,16"

	private JButton jBServir = null;

	private JButton jBVolver = null;
	/**
	 * Objeto restaurante a gestionar. Se pasará como parámetro al resto de clases visuales. 
	 */
	private Restaurante r;
	/**
	 * Lista que va a almacenar los pedidos existentes
	 */
	private List<Pedido> pedidos = null;
	/**
	 * En esta lista almacenaremos las consumiciones listas
	 */
	private List<Consumicion> consumicionesListas = null;
	/**
	 * En esta lista almacenaremos las consumiciones listas que ha seleccionado el camarero al hacer click
	 */
	private List<Consumicion> consumicionesSeleccionadas=null;  //  @jve:decl-index=0:

	

	/**
	 * Constructor público.
	 * Como con todas las clase gráficas de la PDA, se le pasa el objeto restaurante para que siga vivo en memoria
	 * @param r
	 */

	public SevirPlatos(Restaurante r) {
		this.r=r;
		
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(240, 320);
		this.setPreferredSize(new Dimension(240, 320));
		this.setMinimumSize(new Dimension(240, 320));
		this.setName("servirPlatos");
		this.setMaximumSize(new Dimension(240, 320));
		this.setContentPane(getJContentPane());
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "SERVIR PLATOS", TitledBorder.CENTER, TitledBorder.ABOVE_TOP, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			jContentPane.setToolTipText("Seleccione los platos que van a ser servidos en mesa");
			jContentPane.setName("panelServirPlatos");
			jContentPane.add(getJSPlatosListos(), null);
			jContentPane.add(getJBServir(), null);
			jContentPane.add(getJBVolver(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jBServir	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBServir() {
		if (jBServir == null) {
			jBServir = new JButton();
			jBServir.setActionCommand("Servir");
			jBServir.setSize(new Dimension(100, 30));
			jBServir.setIcon(new ImageIcon(getClass().getResource("/iconos/cup_go.png")));
			jBServir.setMnemonic(KeyEvent.VK_S);
			jBServir.setText("Servir");
			jBServir.setName("servir");
			jBServir.setToolTipText("Click para indicar al sistema que los platos han sido servidos en mesa");
			jBServir.setEnabled(false);
			jBServir.setLocation(new Point(10, 280));
			jBServir.addActionListener(this);
		}
		return jBServir;
	}

	/**
	 * This method initializes jBVolver	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBVolver() {
		if (jBVolver == null) {
			jBVolver = new JButton();
			jBVolver.setToolTipText("Click para volver al menú principal");
			jBVolver.setMnemonic(KeyEvent.VK_V);
			jBVolver.setActionCommand("Volver");
			jBVolver.setIcon(new ImageIcon(getClass().getResource("/iconos/arrow_undo.png")));
			jBVolver.setText("Volver");
			jBVolver.setLocation(new Point(128, 280));
			jBVolver.setSize(new Dimension(100, 30));
			jBVolver.setName("servir");
			jBVolver.addActionListener(this);
		}
		return jBVolver;
	}
	

	/**
	 * This method initializes jSPlatosListos	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJSPlatosListos() {
		if (jSPlatosListos == null) {
			jSPlatosListos = new JScrollPane();
			jSPlatosListos.setBounds(new Rectangle(6, 25, 228, 245));
			jSPlatosListos.setBorder(BorderFactory.createTitledBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED), "Platos listos:", TitledBorder.LEFT, TitledBorder.ABOVE_TOP, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			jSPlatosListos.setViewportView(getJTPlatosListos());
		}
		return jSPlatosListos;
	}

	/**
	 * This method initializes jTPlatosListos	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTPlatosListos() {
		if (jTPlatosListos == null)
		{
			this.creaTablaModelo();
			jTPlatosListos = new JTable(this.tablaModelo);
			jTPlatosListos.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
			jTPlatosListos.setShowGrid(true);
			jTPlatosListos.setToolTipText("Seleccione los platos a servir");
			jTPlatosListos.setAutoCreateColumnsFromModel(false);
			jTPlatosListos.setCellSelectionEnabled(false);
			jTPlatosListos.setRowSelectionAllowed(true);
			jTPlatosListos.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
			jTPlatosListos.setShowHorizontalLines(true);
			
			jTPlatosListos.getColumnModel().getColumn(0).setPreferredWidth(80);
			jTPlatosListos.getColumnModel().getColumn(1).setPreferredWidth(30);
			jTPlatosListos.getColumnModel().getColumn(2).setPreferredWidth(110);
						
			jTPlatosListos.getSelectionModel().addListSelectionListener(this);
		}
		return jTPlatosListos;
	}
	/**
	 * Método interno que inicializa el modelo
	 *
	 */
	private void creaTablaModelo()
	{
		tablaModelo=new DefaultTableModel();
		
		tablaModelo.addColumn("Pedido");
		tablaModelo.addColumn("Silla");
		tablaModelo.addColumn("Plato Disponible");
		
		this.pedidos = r.recuperarPedidos();
		this.consumicionesListas = new LinkedList<Consumicion>();
		this.consumicionesSeleccionadas= new LinkedList<Consumicion>();
		
		if(this.pedidos != null)
		{
			//recorremos la lista de Pedidos y vamos obteniendo sus consumiciones 'listas'
			ListIterator<Pedido> itp = this.pedidos.listIterator();
			//mientras haya pedidos
			while(itp.hasNext())
			{
				Pedido p = itp.next();
				
				List<Mesa> lm = p.getMesas();
				String mesas = "";
				int numCom=-1;
				String plato="";
				
				if (lm!=null)
				{
					//recorremos la lista de mesas asociadas al pedido incluyendo su numero de mesa
					ListIterator<Mesa> itm= lm.listIterator();
					while(itm.hasNext())
						mesas=mesas+(itm.next().getNumMesa())+",";
				}				
				
				//Una vez obtenidas las mesas, para cada pedido sacamos sus consumiciones listas
				List<Consumicion> lc = p.recuperarPlatosListos();
				if(lc!=null)
				{
					ListIterator<Consumicion> itc = lc.listIterator();
					while (itc.hasNext())
					{
						Consumicion c = itc.next();
						numCom = c.getNumComensal();
						plato = c.getProducto().consultarNombreProducto();
						
						Object[] row={mesas,numCom,plato};
						tablaModelo.addRow(row);
						consumicionesListas.add(c);						
					}							
				}				
			}
		}
		else
			System.err.println("ERROR al obtener los pedido de la lista de Pedidos");			
	}
	/**
	 * Gestion de seleccion de filas
	 */
	public void valueChanged(ListSelectionEvent e) 
	{
		int[] filas = this.getJTPlatosListos().getSelectedRows();
		this.consumicionesSeleccionadas.clear();
		//si hay seleccionada alguna fila
		if(filas.length>=0)
		{	
			for(int i=0;i<filas.length;i++)
				this.consumicionesSeleccionadas.add(this.consumicionesListas.get(filas[i]));
				
			this.jBServir.setEnabled(true);				
		}
		//ninguna fila seleccionada
		else
		{
			this.consumicionesSeleccionadas.clear();
			this.jBServir.setEnabled(false);
		}		
	}
	/**
	 *  Gestión de los botones
	 */
	public void actionPerformed(ActionEvent e) 
	{
		if (e.getActionCommand().equals("Volver"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new MenuPrincipal(r).setVisible(true);			
		}
		else if(e.getActionCommand().equals("Servir"))
		{
			ListIterator<Consumicion> itc = consumicionesSeleccionadas.listIterator();
			while(itc.hasNext())
			{
				Consumicion c = itc.next();
				c.setEstado(Consumicion.SERVIDO);
				c.actualizarConsumicion();				
			}	
			//despues de poner los platos listos, volvemos a crear la tabla
			this.creaTablaModelo();
			jTPlatosListos.setModel(this.tablaModelo);
			this.jBServir.setEnabled(false);
		}
	}
	
}

